home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / 92052tar.gz / 920528.tar / tcpdump.c < prev    next >
C/C++ Source or Header  |  1991-05-10  |  2KB  |  82 lines

  1. /* @(#) $Header: tcpdump.c,v 1.5 91/05/09 07:38:56 deyke Exp $ */
  2.  
  3. /* TCP header tracing routines
  4.  * Copyright 1991 Phil Karn, KA9Q
  5.  */
  6. #include <stdio.h>
  7. #include "global.h"
  8. #include "mbuf.h"
  9. #include "netuser.h"
  10. #include "internet.h"
  11. #include "tcp.h"
  12. #include "ip.h"
  13. #include "trace.h"
  14.  
  15. /* TCP segment header flags */
  16. static char *Tcpflags[] = {
  17.     "FIN",  /* 0x01 */
  18.     "SYN",  /* 0x02 */
  19.     "RST",  /* 0x04 */
  20.     "PSH",  /* 0x08 */
  21.     "ACK",  /* 0x10 */
  22.     "URG",  /* 0x20 */
  23.     "CE"    /* 0x40 */
  24. };
  25.  
  26. /* Dump a TCP segment header. Assumed to be in network byte order */
  27. void
  28. tcp_dump(fp,bpp,source,dest,check)
  29. FILE *fp;
  30. struct mbuf **bpp;
  31. int32 source,dest;      /* IP source and dest addresses */
  32. int check;              /* 0 if checksum test is to be bypassed */
  33. {
  34.     struct tcp seg;
  35.     struct pseudo_header ph;
  36.     int16 csum;
  37.     int16 dlen;
  38.  
  39.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  40.         return;
  41.  
  42.     /* Verify checksum */
  43.     ph.source = source;
  44.     ph.dest = dest;
  45.     ph.protocol = TCP_PTCL;
  46.     ph.length = len_p(*bpp);
  47.     csum = cksum(&ph,*bpp,ph.length);
  48.  
  49.     ntohtcp(&seg,bpp);
  50.  
  51.     fprintf(fp,"TCP: %u->%u Seq x%lx",seg.source,seg.dest,seg.seq,seg.ack);
  52.     if(seg.flags.ack)
  53.         fprintf(fp," Ack x%lx",seg.ack);
  54.     if(seg.flags.congest)
  55.         fprintf(fp," %s",Tcpflags[6]);
  56.     if(seg.flags.urg)
  57.         fprintf(fp," %s",Tcpflags[5]);
  58.     if(seg.flags.ack)
  59.         fprintf(fp," %s",Tcpflags[4]);
  60.     if(seg.flags.psh)
  61.         fprintf(fp," %s",Tcpflags[3]);
  62.     if(seg.flags.rst)
  63.         fprintf(fp," %s",Tcpflags[2]);
  64.     if(seg.flags.syn)
  65.         fprintf(fp," %s",Tcpflags[1]);
  66.     if(seg.flags.fin)
  67.         fprintf(fp," %s",Tcpflags[0]);
  68.  
  69.     fprintf(fp," Wnd %u",seg.wnd);
  70.     if(seg.flags.urg)
  71.         fprintf(fp," UP x%x",seg.up);
  72.     /* Print options, if any */
  73.     if(seg.mss != 0)
  74.         fprintf(fp," MSS %u",seg.mss);
  75.     if((dlen = len_p(*bpp)) != 0)
  76.         fprintf(fp," Data %u",dlen);
  77.     if(check && csum != 0)
  78.         fprintf(fp," CHECKSUM ERROR (%u)",csum);
  79.     putc('\n',fp);
  80. }
  81.  
  82.